package com.free.ext.wechat;

import com.foxinmy.weixin4j.cache.MemoryCacheStorager;
import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.mp.api.MpApi;
import com.free.ext.wechat.little.LittleWxProxy;
import com.free.ext.wechat.mp.MpWxProxy;
import com.free.ext.wechat.qy.QyWxProxy;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class WxProxyManager {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    private static final Map<String,Object> proxys = new ConcurrentHashMap<>();

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    public static <T>  T getProxy(WechatAccount accnt){
        WeixinAccount wxAccnt = toWeixinAccount(accnt);
        Object proxy = null;
        if(proxys.containsKey(accnt.getAppid())){
            return (T) proxys.get(accnt.getAppid());
        }
        if(accnt.getAccType().getKey() == ENUM_ACCOUNT_TYPE.company.getKey()){
            proxy = new QyWxProxy(wxAccnt,new MemoryCacheStorager<>());
        }else if(accnt.getAccType().getKey() == ENUM_ACCOUNT_TYPE.little.getKey()){
            proxy = new LittleWxProxy(wxAccnt,new MemoryCacheStorager<>());
        }else {
            proxy = new MpWxProxy(wxAccnt,new MemoryCacheStorager<>());
        }
        proxys.put(accnt.getAppid(), proxy);
        return (T) proxy;
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/

    private static WeixinAccount toWeixinAccount(WechatAccount accnt){
        WeixinAccount wxAccnt = new WeixinAccount(accnt.getAppid(),accnt.getAppsecret());
        return wxAccnt;
    }
}
